home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / source / raster9 / gencod7.pas < prev    next >
Pascal/Delphi Source File  |  1992-03-07  |  11KB  |  414 lines

  1. { lit un fichier ?.dat et crèe trois fichiers
  2.       ?.asm   ; code généré sprite ( CH doit etre mis a zero )
  3.       ?.fsm   ; code généré fond   ( CH à 0 )
  4.       ?.nda   ; sauve en dc.b les datas non nuls du sprite
  5. }
  6.  
  7. program make_generate_code;
  8.  
  9.  Uses Dos,Crt;
  10.  
  11. var
  12.    zero,i,j,n,x,y,c:      integer;
  13.    name,sauve:            string;
  14.    nulcpt,cycle:          integer;
  15.    handle:                integer;
  16.    regs:                  registers;
  17.    M:                     array [0..79*79] of byte;
  18.    nulM:                  array [0..79*79] of byte;
  19.    res:                   text;
  20.    buf:                   string[20];
  21.  
  22. (* ******************************************************* *)
  23.  
  24. Procedure Open(op:char;name:string;Var handle:integer);
  25.  Begin
  26.   If (op='I') Or (op='i') Then
  27.    Begin
  28.  
  29.      regs.ah:=$3d;
  30.      regs.al:=0;
  31.      regs.ds:=Seg(name);
  32.      regs.dx:=Ofs(name)+1;
  33.      MsDos(regs);
  34.      handle:=regs.ax;
  35.  
  36.    End
  37.  
  38.   Else If (op='O') Or (op='o') Then
  39.     Begin
  40.  
  41.      regs.ah:=$3c;
  42.      regs.cx:=0;
  43.      regs.ds:=Seg(name);
  44.      regs.dx:=Ofs(name)+1;
  45.      MsDos(regs);
  46.      handle:=regs.ax;
  47.  
  48.     End;
  49.  
  50.  End;
  51.  
  52. Procedure Bget(handle,segment,offset,length:longint);
  53.  Begin
  54.   regs.ah:=$3f;
  55.   regs.bx:=handle;
  56.   regs.cx:=length;
  57.   regs.ds:=segment;
  58.   regs.dx:=offset;
  59.   MsDos(regs);
  60.  End;
  61.  
  62. Procedure Bput(handle,segment,offset,length:longint);
  63.  Begin
  64.   regs.ah:=$40;
  65.   regs.bx:=handle;
  66.   regs.cx:=length;
  67.   regs.ds:=segment;
  68.   regs.dx:=offset;
  69.   MsDos(regs);
  70.  End;
  71.  
  72. Procedure Closef(handle:integer);
  73.  Begin
  74.   regs.ah:=$3e;
  75.   regs.bx:=handle;
  76.   MsDos(regs);
  77.  End;
  78.  
  79. (* ******************************************************* *)
  80.  
  81.  
  82.  
  83.  
  84. procedure  lire;
  85.  
  86. var
  87.    fichier:     text;
  88.    newname:     string;
  89.  
  90. begin
  91.      writeln('Filename  .dat ?');
  92.      read(name);
  93.      newname:=name+'.dat'+#0;
  94.      writeln('X size ?');
  95.      read(x);
  96.      writeln('Y size ?');
  97.      read(y);
  98.  
  99.      Open('I',newname,handle);
  100.      i:=0;
  101.      while i<x*y do begin
  102.           Bget(handle,Seg(buf),Ofs(buf)+1,1);
  103.           M[i]:=Mem[Seg(buf):Ofs(buf)+1];
  104.           i:=i+1;
  105.      end;
  106.      Closef(handle);
  107.  
  108.  
  109.  
  110. end;
  111.  
  112. (* ******************************************************* *)
  113.  
  114.  
  115.  
  116. (* ******************************************************* *)
  117.  
  118. procedure sauve_data(nbdata:integer);
  119.  
  120. var
  121.    datares:     text;
  122.    sdat:        string;
  123.  
  124. begin
  125.         sdat:=name+'.nda';
  126.         assign(datares,sdat);
  127.         rewrite(datares);
  128.         i:=0;
  129.         write(datares,'    db    ');
  130.         while j<nbdata do begin
  131.           n:=0;
  132.           while (i<>nbdata) and (n<30) do begin
  133.             If n<29 Then
  134.               write(datares,nulM[i],',')
  135.             Else
  136.               write(datares,nulM[i]);
  137.  
  138.             i:=i+1;
  139.             n:=n+1;
  140.           end;
  141.           j:=j+30;
  142.           if j<nbdata then begin
  143.              writeln(datares,' ');
  144.              write(datares,'    db    ');
  145.           end;
  146.         end;
  147.         close(datares);
  148.  
  149. end;
  150.  
  151.  
  152.  
  153. (* ******************************************************* *)
  154. (* ******************************************************* *)
  155. (*                MAIN PROGRAM                             *)
  156. (* ******************************************************* *)
  157. (* ******************************************************* *)
  158.  
  159.  
  160. begin
  161.  
  162. (***************************************)
  163. (* Calcul code génére Affichage Sprite *)
  164. (***************************************)
  165.  
  166.      lire;
  167.  
  168. (* routine qui va générer du code a partir des données de la matrice *)
  169.  
  170.    cycle:=0;
  171.    zero:=0;
  172.    nulcpt:=0;
  173.    i:=0;
  174.    j:=0;
  175.    sauve:=name+'.asm';
  176.    assign(res,sauve);
  177.    rewrite(res);
  178.  
  179.  
  180.    write      (res,'  db   ');
  181.    c:=0;
  182.    while i<x*y do begin
  183.       zero:=0;
  184.       c:=0;
  185.  
  186.       if M[i]=0 Then
  187.        Begin
  188.         while (M[i]=0) and (i<x*y) do begin
  189.             if ((i mod x)=0) and (i>0) Then
  190.              zero:=zero+320-x+1
  191.             Else
  192.              zero:=zero+1;
  193.  
  194.              i:=i+1;
  195.         end;
  196.        End
  197.  
  198.       Else
  199.  
  200.        Begin
  201.         If (i mod x)=0 Then Begin
  202.           nulM[nulcpt]:=M[i];
  203.           nulcpt:=nulcpt+1;
  204.           c:=1;
  205.           i:=i+1;
  206.           if i>0 Then
  207.             zero:=320-x;
  208.         End;
  209.  
  210.         while (M[i]<>0) and ((i mod x)<>0) do begin
  211.           nulM[nulcpt]:=M[i];
  212.           nulcpt:=nulcpt+1;
  213.           c:=c+1;
  214.           i:=i+1;
  215.         end;
  216.  
  217.  
  218.        End;
  219.  
  220.  
  221.        if  zero>0 then begin
  222.                     if zero<128 then begin
  223.                                      write(res,'83h,0C7h,',zero,','); {code correspondant a ADD DI,byte }
  224.                                      cycle:=cycle+3;
  225.                                      end
  226.                                 else begin
  227.                                      writeln(res,'81h,0C7h');        {code correspondant a ADD DI,word }
  228.                                      writeln(res,'  dw  ',zero);
  229.                                      if i<x*y then
  230.                                       write(res,'  db  ');
  231.                                      cycle:=cycle+3;
  232.                                      end;
  233.  
  234.                end;
  235.  
  236.        if  c>0 then begin
  237.          case c of 1 : begin
  238.                         write(res,'0A4h,');      { A4 = code de MOVSB }
  239.                         cycle:=cycle+5;
  240.                        end;
  241.                    2 : begin
  242.                         write(res,'0A5h,');      { A5 = code de MOVSW }
  243.                         cycle:=cycle+5;
  244.                        end;
  245.                    3 : begin
  246.                         write(res,'0A5h,0A4h,'); { 3 Octets }
  247.                         cycle:=cycle+10;
  248.                        end;
  249.                    4 : begin
  250.                         write(res,'0A5h,0A5h,'); { 4 Octets }
  251.                         cycle:=cycle+10;
  252.                        end;
  253.                    5 : begin
  254.                         write(res,'0A5h,0A5h,0A4h,'); { 5 Octets }
  255.                         cycle:=cycle+15;
  256.                        end;
  257.                    6 : begin
  258.                         write(res,'0A5h,0A5h,0A5h,'); { 6 Octets }
  259.                         cycle:=cycle+15;
  260.                        end;
  261.  
  262.  
  263.                    else begin
  264.                          write(res,'0B1h,',c Shr 1,',0F3h,0A5h,');   { MOV CL,x  REP MOVSW }
  265.                          cycle:=cycle+5+5+2+(c Shr 1);
  266.                          if (c and 1)=1 Then
  267.                           begin
  268.                            write(res,'0A4h,');      { MOVSB si Impaire }
  269.                            cycle:=cycle+5;
  270.                           end;
  271.                         end;
  272.          end;
  273.  
  274.        end;
  275.  
  276.  
  277.    end;
  278.  
  279.    close(res);
  280.    writeln('File ',sauve,' has been created ');
  281.    
  282.    sauve_data(nulcpt);     {sauve les data non nulles}
  283.  
  284.    writeln('1) 20 MHz 286 time : ',cycle,' cycles soit ',Trunc(1000/20*cycle),' ns ');
  285.  
  286. (****************************************)
  287. (* Calcul code généré Restitue Fond     *)
  288. (****************************************)
  289.  
  290. (* routine qui va générer du code a partir des données de la matrice *)
  291.  
  292.    cycle:=0;
  293.    zero:=0;
  294.    nulcpt:=0;
  295.    i:=0;
  296.    j:=0;
  297.    sauve:=name+'.fsm';
  298.    assign(res,sauve);
  299.    rewrite(res);
  300.  
  301.  
  302.    write      (res,'  db   ');
  303.    c:=0;
  304.    while i<x*y do begin
  305.       zero:=0;
  306.       c:=0;
  307.  
  308.       if M[i]=0 Then
  309.        Begin
  310.         while (M[i]=0) and (i<x*y) do begin
  311.             if ((i mod x)=0) and (i>0) Then
  312.              zero:=zero+320-x+1
  313.             Else
  314.              zero:=zero+1;
  315.  
  316.              i:=i+1;
  317.         end;
  318.        End
  319.  
  320.       Else
  321.  
  322.        Begin
  323.         If (i mod x)=0 Then Begin
  324.           nulM[nulcpt]:=M[i];
  325.           nulcpt:=nulcpt+1;
  326.           c:=1;
  327.           i:=i+1;
  328.           if i>0 Then
  329.             zero:=320-x;
  330.         End;
  331.  
  332.         while (M[i]<>0) and ((i mod x)<>0) do begin
  333.           nulM[nulcpt]:=M[i];
  334.           nulcpt:=nulcpt+1;
  335.           c:=c+1;
  336.           i:=i+1;
  337.         end;
  338.  
  339.  
  340.        End;
  341.  
  342.  
  343.        if  zero>0 then begin
  344.                     if zero<128 then begin
  345.                                      write(res,'83h,0C7h,',zero,','); {code correspondant à ADD DI,byte }
  346.                                      write(res,'83h,0C6h,',zero,','); {code coresspondant à ADD SI,byte }
  347.                                      cycle:=cycle+3+3;
  348.                                      end
  349.                                 else begin
  350.                                      writeln(res,'81h,0C7h');        {code correspondant à ADD DI,word }
  351.                                      writeln(res,'  dw  ',zero);
  352.                                      writeln(res,'  db 81h,0C6h');   {code correspondant à ADD SI,word }
  353.                                      writeln(res,'  dw  ',zero);
  354.                                      if i<x*y then
  355.                                       write(res,'  db  ');
  356.                                      cycle:=cycle+3+3;
  357.                                      end;
  358.  
  359.                end;
  360.  
  361.        if  c>0 then begin
  362.          case c of 1 : begin
  363.                         write(res,'0A4h,');      { A4 = code de MOVSB }
  364.                         cycle:=cycle+5;
  365.                        end;
  366.                    2 : begin
  367.                         write(res,'0A5h,');      { A5 = code de MOVSW }
  368.                         cycle:=cycle+5;
  369.                        end;
  370.                    3 : begin
  371.                         write(res,'0A5h,0A4h,'); { 3 Octets }
  372.                         cycle:=cycle+10;
  373.                        end;
  374.                    4 : begin
  375.                         write(res,'0A5h,0A5h,'); { 4 Octets }
  376.                         cycle:=cycle+10;
  377.                        end;
  378.                    5 : begin
  379.                         write(res,'0A5h,0A5h,0A4h,'); { 5 Octets }
  380.                         cycle:=cycle+15;
  381.                        end;
  382.                    6 : begin
  383.                         write(res,'0A5h,0A5h,0A5h,'); { 6 Octets }
  384.                         cycle:=cycle+15;
  385.                        end;
  386.  
  387.  
  388.                    else begin
  389.                          write(res,'0B1h,',c Shr 1,',0F3h,0A5h,');   { MOV CL,x  REP MOVSW }
  390.                          cycle:=cycle+5+5+2+(c Shr 1);
  391.                          if (c and 1)=1 Then
  392.                           begin
  393.                            write(res,'0A4h,');      { MOVSB si Impaire }
  394.                            cycle:=cycle+5;
  395.                           end;
  396.                         end;
  397.          end;
  398.  
  399.        end;
  400.  
  401.  
  402.    end;
  403.  
  404.    close(res);
  405.    writeln('File ',sauve,' has been created ');
  406.    
  407.    writeln('2) 20 MHz 286 time : ',cycle,' cycles soit ',Trunc(1000/20*cycle),' ns ');
  408.  
  409.  
  410.    Repeat
  411.    Until KeyPressed;
  412.  
  413. end.
  414.